﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace SkladLib
{
    /// <summary>
    /// Třída jako přepravka s informacemi o jendotlivích zbožích
    /// </summary>
   public class Zbozi
    {
       public string name;
       public string code;
       public bool isFree = false;
       public CenovyProfil cenovyProfil = new CenovyProfil();
       public string idDatabase;
       public List<Rezervace> rezervace = new List<Rezervace>();

       /// <summary>
       /// Nastavi zbozi jeslti je pujceno a ulozi do DB tudle informaci
       /// </summary>
       /// <param Name="jePujceno"></param>
       public void SetPujceno(bool jePujceno)
       {
           Dictionary<string,string> row = new Dictionary<string,string>();
           row.Add("naSklade", (!jePujceno).ToString());
           DataLib.Settings.databases.dbSklad.UpdateRow(row, "Sklad", "WHERE id ='" + idDatabase + "'");
       }

       public void Rezervovat(string name, DateTime _od, DateTime _do)
       {
           Dictionary<string, string> row = new Dictionary<string, string>
               {
                   {"od", _od.ToString()},
                   {"do", _do.ToString()},
                   {"jmeno", name},
                   {"idPolozka", idDatabase}
               };
           DataLib.Settings.databases.dbSklad.AddRow("Rezervace", row);
           rezervace.Clear();
           rezervace = LoadRezervace(idDatabase);
       }

       /// <summary>
       /// Smaze rezervaci jak z db tak z teto tridy
       /// </summary>
       /// <param name="idRezervace"></param>
       /// <returns>False znamená že taková rezervace nebyla nalezena</returns>
       public bool TryRemoveRezervace(int idRezervace)
       {
           for(int i = 0;i < rezervace.Count;i++)
           {
               if(rezervace[i].IdRezervace == idRezervace)
               {
                   rezervace[i].RemoveFromDatabase();
                   rezervace.RemoveAt(i);
                   return true;
               }
           }
           return false;
       }
  
       public string[] GetAllZboziNames()
       {
           return DataLib.Settings.databases.dbSklad.QueryGetListString("SELECT Name FROM Sklad").ToArray();
       }

       private static Zbozi DictionaryToZbozi(Dictionary<string, string> dictionary)
       {

           Zbozi zbozi = new Zbozi
           {
               code = dictionary["kod"],
               idDatabase = dictionary["id"],
               isFree = bool.Parse(dictionary["naSklade"]),
               name = dictionary["name"],
               cenovyProfil = CenovyProfil.GetCenovyProfilByPrefix(dictionary["cenovyProfilPrefix"])
           };
           zbozi.rezervace = LoadRezervace(zbozi.idDatabase);
           return zbozi;

           return null;
       }

       private static List<Rezervace> LoadRezervace(string idPolozka)
       {
           List<int> rezervaceList = DataLib.Settings.databases.dbSklad.QueryGetListInt("SELECT [idRezervace] FROM Rezervace WHERE [idPolozka] = '" + idPolozka + "'");

           /* upraveno - Martin
           List<Rezervace> rezervace = new List<Rezervace>();
           foreach (int rezervaceId in rezervaceList)
           {
               rezervace.Add(Rezervace.GetRezervateById(rezervaceId));
           }
           return rezervace;
            * */
           // LINQ vyraz
           return rezervaceList.Select(Rezervace.GetRezervaceById).ToList();

       }


       /// <summary>
       /// Vrací třídu zbozi z databáze
       /// </summary>
       /// <param Name="Name"></param>
       /// <returns></returns>
       public static Zbozi GetZboziByName(string name)
       {
           return DictionaryToZbozi(DataLib.Settings.databases.dbSklad.QueryGetRow("SELECT * FROM Sklad WHERE Name='" + name + "'"));
       }

       /// <summary>
       /// Vrací třídu zbozi z databáze
       /// </summary>
       /// <param Name="id"></param>
       /// <returns></returns>
       public static Zbozi GetZboziById(string id)
       {

           return DictionaryToZbozi(DataLib.Settings.databases.dbSklad.QueryGetRow("SELECT * FROM Sklad WHERE id='" + id + "'"));
       }

       /// <summary>
       /// Vrací třídu zbozi z databáze
       /// </summary>
       /// <param Name="id"></param>
       /// <returns></returns>
       public static Zbozi GetZboziByCode(string code)
       {
           return DictionaryToZbozi(DataLib.Settings.databases.dbSklad.QueryGetRow("SELECT * FROM Sklad WHERE kod='" + code + "'"));
       }

       /// <summary>
       /// Zjisti zda zbozi existuje
       /// </summary>
       /// <param Name="id"></param>
       /// <returns></returns>
       public static bool ExistZboziByCode(string code)
       {
           if (DataLib.Settings.databases.dbSklad.QueryGetInt("SELECT COUNT(*) FROM Sklad WHERE kod='" + code + "'") > 0)
               return true;
           else
               return false;
       }
    }
}
